Other places...
Assemply lessons
Lesson 1
Lesson 2
Lesson 3
Lesson 4
Lesson 5
Lesson 6
Lesson 7
Lesson 8
Lesson 9


Tools
Html Tester V 1.0
Code Encoder New

Vbcode
Under construction

Games
X & O الإصداره العربيه
X & O English Edition

Links
الفريق العربى
الموسوعه العربيه
شبكة فارس العامه
المطورون العرب
فجوال بيسك للعرب
الخبر كافيه
المهندس
www.vbzoom.com
Free vb codes
Linux for arabs
Free compilers
3alam el-computer
A good IT gate
www.ahliz.org


Mix
الدعاء
Site Packages
News(arabic)
My whispers
Site poles
About mrezzuz
Send feed-back

Ezzuz web site
الدرس السابع 5/6/2003
    مقدمه

السلام عليكم ثانيةً ... تابعنا سوياً الدروس السابقه فى لغتنا المحببه الأسمبلى وتعرفنا على ماهى اللغه و خواصها و قدرتها ... تمام .!؟
وتابعنا أيضاً الدرس السادس و الذى يشرح التفاصيل الأساسيه فى اللغه و كيفية كتابة البرامج و كيفية تشغيلها.
سنبدأ إن شاء الله هذا الدرس و الذى سيكون حول مواضيع متقدمه نسبياً .
ملحوظه : لاحظتم أن الدرس إن شاء الله سيكون باللغه العربيه بناءاً على طلبكم .

(1)    العمليات الحسابيه المتقدمه و تنقسم إلى ضرب و قسمه :-

الضرب Multiplication :-

يتم ضرب أى رقمين فى لغة الأسمبلى فى ثلاث أنظم ألى الآن :-
  • الأول : ال8-بت (البايت) :-
    يتم وضع إحدى قيم الضرب فى AL و الآخر فى أى ريجستر آخر له نفس الحجم أو مكان فى الذاكره بجانب كود الضرب الذى هو فى حالتنا هنا [MUL] للأرقام الغير محددة الإشاره . و [IMUL] للأرقام المحددة الإشاره .وتوضع النتيجه فى ال AX .
    مثال : للحصول على حاصل ضرب 120 * 30 نقوم بالأتى :-
    ;----------------------------------
    MOV CL,30D
    MOV AL,120D
    MUL CL
    MOV [1000H] , AX     ; لتخزين الناتج فى الذاكره المعنونه ب1000 بالنظام السادس عشر
    ;----------------------------------


  • الثانى : ال16-بت (الكلمه) :-
    يتم وضع إحدى القيم فى AX و ألآخرفى أى ريجستر آخر له نفس الحجم أو مكان فى الذاكره بجانب كود الضرب و توضع النتيجه فى DX:AX . و هذا معناه أن الجزء ال Low من ناتج القسمه سيخزن فى ال AX و الجزء ال High سيوضع فى ال DX .
    مثال : للحصول على حاصل ضرب 20000 * 2365 سنقوم بالآتى :-
    ;----------------------------------
    MOV CX,2365D
    MOV AX,20000D MUL CX
    MOV [1000H],AX     ;تخزين الجزء الأول فى المكان فى الذاكره المعنون ب 1000
    MOV [1001H],DX     ;تخزين الجزء الثانى فى المكان فى الذاكره الذى يلى المكان السابق
    ;----------------------------------


  • الثالث : ال32 بت :-
    يتم وضع إحدى القيم فى EAX و ألآخرفى أى ريجستر آخر له نفس الحجم أو مكان فى الذاكره بجانب كود الضرب و توضع النتيجه(64 بت) فى EDX:EAX . و هذا معناه أن الجزء ال Low من ناتج القسمه سيخزن فى ال EAX و الجزء ال High سيوضع فى ال EDX .



    القسمه Division :-

    أيضاً تتم فى نفس النظم السابقه :-
  • الأول : ال8بت (بايت) :-
    يتم و ضع المقسوم فى AX و المقسوم عليه فى أى ريجستر حجمه بايت مثل BL,CL,DL,... أو مكان فى الذاكره لها حجم بايت مثل BYTE PTR [1234H] , BYTE PTR [BX] .و يوضع ناتج القسمه فى AL و باقى القسمه فى AH بإستخدام [DIV] .
    لاحظ:- أنه فى حالة قسمة الأرقام المحددة الإشاره بإستخدام [IDIV]تكون إشارة ناتج القسمه هى الإشاره العاديه فى هذه الحالات . وتكون إشارة خارج القسمه Remender دائماً موجبه و صحيحه Integer.
    لاحظ:-كل القيم هنا 8-بت إذاً , لابد من تحويل القيمه ال 8-بت للمقسوم إلى 16-بت ليمكن نقلها ألى AX ويتم ذلك فى حالة القيم غير محددة الإشاره بمسح ال AH ليكون كله أصفار و تكون قيمة المقسوم 16-بت . أما فى حالة القيم محددة الإشاره يتم ذلك عن طريق كود [CBW] المسئول عن تحويل البايت(8-بت) إلى كلمه (16-بت) لل AX فقط.
    مثال :- للحصول على ناتج قسمة(+16) على (-5) يمكننا عمل الأتى :-
    ;----------------------------------
    MOV AL,16D
    CBW
    MOV BL,5D
    NEG BL
    IDIV BL
    MOV PYTE PTR[1000H] , AL
    MOV PYTE PTR[2000H] , AH
    ;----------------------------------
    وهنا تم نقل المقسوم إلى AL وتم عمل مد له عن طريق [CBW] . ثم تم نقل قيمة المقسوم عليه إلى BL بعد وضع الإشاره السالبه عن طريق [NEG]. إذا القيم جاهزه لعملية القسمه ويتم حفظ الناتج فى الذاكره بعدها.



    باقى النظم كما سبق من الممكن أن تقوم بإستنتاجها .

  • (2)    التحكم فى مسار البرنامج :-

    ينقسم التحكم فى مسار البرنامج إلى عدة طرق و تقنيات و تكون مثل مثيلاتها فى اللغات العليه و لكن أكثر تفصيلاً . وسنتعلم سوياً بعض من هذه التقنيات :-
  • أولا : جمل الشرط IF Statements :-

    إننى أعتبر جمل الشرط من قواعد البرمجه عموما و من أهم قواعد التحكم فى مسار البرامج خصوصاً.
    تقوم جمل الشرط عموما على و جود شرط أو إختبار لو تحقق إذاً سيقوم البرنامج بعمل بعض المهام لن يكون فاعلها لولم يتحقق الشرط أو فشل الإختبار , كما تحب أن تطلق عليه.
    إذاً , يجب علينا معرفة كيفية إختبار قيمه (والتى يترتب عليها الشرط فيما بعد) .
    الإختبار :-
    يكون بإستخدام دالتين أو كودين و هما [CMP] و [TEST] .

    1-[CMP] :- يجب أن تذكر القيمتين اللتان سوف يتم لهما إختبار بعدها . و عندما تتم هذه الجمله يتم عمل عملية طرح فى الأصل و لكن مع عدم تغيير فى أول مكان (الرجستر أو الذاكره)(Distination).لذلك التغيير يظهر فى ريجستر الأعلام (FLAG REGISTER) فقط و يكون القفز(JUMP) بعد هذا الإختبار شىء طبيعى على أساس إختبار بتات هذا الرجستر الخاص.أو أى عباره تأتى مع القفز كما تم ذكرهم فى الدرس السابق.
    مثال :- سنقوم إختبار تساوى لقيمتين و ليكن 5و4 مثلاً . لو تحقق الشرط سيقفز البرنامج إلى النهايه و لن يكمل
    ;----------------------------------
    MOV AX,5
    MOV BX,4
    CMP AX,BX      ;=AX-BX
    JE END
    ...................
    ...................     ;بعض الجمل البرمجيه التى سوف تنفذ فى حالة عدم التساوى - طبعاً هتتنفذ .
    ...................
    HLT          ;تقوم هنا بوقف البرنامج مثلا أو القفز إلى مكان آخر لأنه من غير ذلك سوف يتم ينفيذ الأوامر التاليه أيضاً
    END:
    ;الكمبيوتر إتجنن . إزاى 5 تساوى 4 .
    ...................
    ...................     ;بعض الجمل البرمجيه التى سوف تنفذ فى حالة التساوى - طبعاً مش هتتنفذ .
    ...................
    ;----------------------------------
    طبعا يوجد جُمل تقوم بالقفز إذا كان عدم التساوى أكبر من مثلاً أو القيمه الأولى أصغر من الأخرى وهكذا . يوجد الكثير و الكثير كما تحب أن تكتب برامجك.


    2-[TEST] :-تقوم بالعمل السابق نفسه و لكن بدلاً من عمل عملية طرح , تقوم بعمل Logic AND و هى-بينى و بينكم-تستخدم فى إختبار بت واحده و هذه العمليه تسمى Masking .
    مثال :- تعالو لنرى ماذا ستفعل هذه الداله :-
    ;----------------------------------
    MOV AX,5
    NEG AX
    ADD AX,2
    TEST AX,10000000B
    JZ END
    ;القيمه سالبه كما هو متوقع
    HLT
    END:
    ;القيمه موجبه . كما هو ليس متوقع إطلاقاً.
    ;----------------------------------
    المثال السابق يوضح إستخدام الأمر [TEST] فى إختبار آخر بت فى القيمه الموجوده فى الAX وهذه البت توضح إشارة الرقم كما لابد أن نعرف.فقمت بعمل
    TEST(AND) WITH 10000000B , IF the most segnificant bit in AX is (1) then zero flag will reset , else it will be set by the processor.

  • (3)    الدورات loops :-

    - من أهم قدرات الحاسب الألى هى عمل نفس الشىء مرات عده و لا تختلف معه عدد هذه المرات و هى من أهم جوانب البرمجه أصلاً . فلا يمكن لبرنامج مفيد ألا يحتوى على دوره أو عدة دورات لذا كان من المهم أن ندرجها هنا و تكون بعد التحكم فى مسار البرامج لما لها من إرتباط وثيق بما سوف نتحدث عليه.

    - هناك ثلاث أنواع من الدورات تتم بثلاث تقنيات مختلفه . سيتم ذكر الأنواع أولاً ثم تتبعها طرق عملها و تقنياتها :-

    الأنواع :-
  • الدورات المستمره (إلى مالانهايه) :-
    وهى الدورات التى تظل عامله إلى أن يتم غلق البرنامج من جانب نظام التشغيل أو غلق الجهاز نفسه . و طبعاً أنت تسأل نفسك هل لهذا النوع فائده فى البرمجه . أرد عليك بنعم كما سترى :-

    - التارخ و الساعه , هل هما يتوقفان !!؟ بالطبع لا.
    - من الممكن إستخدامها فى ترك البرنامج عاملاً وهذا فى الللغات التى تعتمد على الأوامر المتواليه Squencial programming .
    - أيضاً من الممكن أن تستخدم فى عمل الفيروسات . تكفى دوره صغيره غير منتهيه لإستغلال معظم و قت المعالج من غير فائده و التأثير على باقى البرامج الأخرى فى النظم متعددة البرامج Multiprogramming and Time-sharing Operating systems .


  • الدورات محددة المرات :-
    فى هذه الدورات يكون عدد مرات تنفيذ الدوره محدد و هى من أكثر الأنواع إنتشاراً و لها إستخدامات عده تتنوع بين العمليات الحسابيه والمنطقيه و باقى العمليات الأخرى.
    من أمثلتها ال FOR...NEXT) LOOP) .


  • الدورات المحدده بشرط معين :-
    يكون هناك شرط يتم إختباره فى أول الدوره أو فى آخرها . ويتوقف تنفيذ المره التاليه فى الدوره على إختبار هذا الشرط , وهنا يتم إستخدام إحدى الشروط و طرق إختبارها السابقه.




    التقنيات و طرق العمل:-
  • الطريقه اليدويه :-
    عن طريق تحديد عنوان فى أول أمر فى الدوره ثم فى نهاية أوامر الدوره يتم إدراج أمر قفز للعنوان الذى وضعناه سابقاً و يكون القفز مشروط أو غير مشروط (Conditional / Unconditional Jump) .
    مثال :-
    ;----------------------------------
    MOV AL,5
    XOR CL,CL ;CL = 0
    START_LOOP : ;بداية الدوره
    ADD CL,AL
    DEC AL
    CMP AL,00H ; قارن القيمه الموجوده فى الAL والصفر.
    JNE START_LOOP
    ;يتم القفظ لو لم يكون AL يساوى صفر
    MOV BYTE PTR [0100H],AL ;تخزين الناتج النهائى فى الذاكره .
    ;----------------------------------
    فى المثال السابق تم إستخدام الدوره المشروطه START_LOOP فى جمع الأرقام من 1 إلى 5 و تخزينهم فى الذاكره .


  • الدورات بإستخدام الأمر LOOP :-
    هذا الأمر له صور عده منها المشروط و منها الغير مشروط كما لابد أن نرى :-
    [LOOP]:- يتم كتابة أسم أو عنوان أول جمله/أمر فى الدوره , ويتم وضع عدد مرات الدوره فى CX , وتقوم بتقليل ال CX بواحد وتختبر قيمته لو كانت صفر تنهى الدوره و لو غير ذلك يتم القفز ألى العنوان الموجود أمامها .
    مثال :-
    ;----------------------------------
    MOV CX,5
    XOR AX,AX
    START_LOOP :
    ADD AX,CX
    LOOP START_LOOP
    MOV [0100H],AX
    ;----------------------------------
    نفس المثال السابق.

    Conditional LOOP:-
    • LOOPZ
    • LOOPNZ
    • LOOPE
    • LOOPNE
    وهذه الأنواع تستخدم بعد CMP/TEST Instructions , وعلى حسب الشرط يتم القفز , ويكون إستخدامها مثل LOOP .


  • الدورات بإستخدام REP :-
    وهى تستخدم مع نقل البيانات String Transfer Istructions و سنتعرض لها أن شاء الله فى الدرس القادم .

    إلى هنا ينتهى درس الأسمبلى السابع و أرجو من الله أن يكون سهلاً و بسيطاً و أن يكون قدم شيئاً مفبداً و جديداً لأخواننا الأعزاء.
    ولا تنسونى من الدعاء يا أخوانى .
    والسلام عليكم و رحمة الله و بركاته

  • Send feed-back to webmaster@1t.2t.3t.4t.com
    Copy rights reserved to Ezzuz web site
    22 / 3 / 2003
    <<< Aseemply 6                         Assemply 7                         Assemply 8 >>>